Перейти к основному содержимому

5.02. Управляющие конструкции

Разработчику Архитектору

Управляющие конструкции

Управляющие конструкции в языке программирования Python представляют собой средства управления последовательностью выполнения инструкций в программе. Они позволяют изменять линейный поток исполнения кода в зависимости от условий, повторять блоки инструкций или управлять переходами между участками программы. Эти конструкции составляют основу структурного программирования и обеспечивают гибкость при реализации алгоритмов любой сложности.

Условные операторы

Условные операторы предназначены для ветвления выполнения программы на основе логических выражений. В Python используется ключевое слово if для начала проверки условия, elif (сокращение от else if) — для дополнительных условий, и else — для блока, выполняемого в случае, если ни одно из предыдущих условий не было истинным.

Синтаксис условной конструкции:

if условие1:
# блок кода 1
elif условие2:
# блок кода 2
else:
# блок кода 3

Каждый блок кода должен быть выделен отступом (PEP 8 рекомендует использовать 4 пробела). Интерпретатор оценивает условия по порядку; выполнение передаётся первому блоку, чьё условие вернуло True. Остальные ветви игнорируются.

Пример:

x = 10
if x > 15:
print("x больше 15")
elif x > 5:
print("x больше 5, но не больше 15")
else:
print("x меньше или равно 5")

Важно отметить, что ветви elif и else являются опциональными. Конструкция может состоять только из одного if.

Логические операторы

Логические операторы используются для комбинирования или инвертирования булевых выражений. В Python они представлены словами and, or, not, в отличие от многих других языков программирования, где применяются символьные аналоги (&&, ||, !). Это делает код более читаемым, но требует внимания при сравнении с другими C-подобными языками.

  • and — возвращает True, если оба операнда истинны.
  • or — возвращает True, если хотя бы один операнд истинен.
  • not — возвращает логическое отрицание операнда.

Операторы работают по принципу короткого замыкания (short-circuit evaluation):

  • x and y: если x ложно, y не вычисляется.
  • x or y: если x истинно, y не вычисляется. Пример:
a = True
b = False
print(a and b) # False
print(a or b) # True
print(not a) # False

Такой подход позволяет эффективно управлять порядком вычислений и избегать ошибок, например:

if obj is not None and obj.has_method():
obj.method()

Здесь has_method() не будет вызван, если objNone, поскольку первая часть условия ложна, и вторая не вычисляется.

Циклы

Циклы предназначены для многократного выполнения блока кода. В Python реализованы два типа циклов: for и while, каждый из которых решает разные задачи.

Цикл for в Python является итерационным, а не счётным, как в некоторых других языках. Он предназначен для обхода элементов итерируемого объекта — коллекций, строк, диапазонов и других объектов, поддерживающих протокол итерации.

Синтаксис:

for переменная in итерируемый_объект:
# тело цикла

Часто в качестве итерируемого объекта используется функция range(), которая генерирует арифметическую последовательность чисел. Функция range(stop) — создаёт объект диапазона, содержащий целые числа от 0 до stop - 1.

range(start, stop[, step]) позволяет задать начальное значение, конечное значение (не включая его) и шаг.

Примеры:

# Вывод значений от 0 до 9
for i in range(10):
print(i, end=" ")
print()

# От 0 до 45 с шагом 5
for i in range(0, 50, 5):
print(i, end=" ")
print()

# Обратный порядок: от 10 до 1
for i in range(10, 0, -1):
print(i, end=" ")
print()

# Итерация по строке
for letter in 'word':
print(letter)

Обратите внимание: range() возвращает объект типа range, который является ленивым (lazy) — числа генерируются по мере необходимости, что экономит память.

Цикл for можно использовать с любыми итерируемыми типами: списками, кортежами, множествами, словарями (ключи), генераторами и т.д.

Цикл while выполняет блок кода до тех пор, пока указанное условие остаётся истинным. Он используется, когда количество итераций заранее неизвестно.

Синтаксис:

while условие:
# тело цикла

Пример:

count = 0
while count < 5:
print(count)
count += 1

Важно обеспечить выход из цикла, иначе он станет бесконечным. Бесконечный цикл возникает, если условие никогда не становится ложным:

while True:
print("Это бесконечный цикл")

Такие конструкции допустимы, если внутри цикла предусмотрен механизм прерывания через break.

Для детального контроля над выполнением циклов и условных блоков в Python предусмотрены специальные управляющие инструкции.

break — немедленно прекращает выполнение текущего цикла и передаёт управление следующему за ним блоку кода. Часто используется при поиске элемента или обработке ошибок.

for i in range(10):
if i == 5:
break
print(i) # Вывод: 0, 1, 2, 3, 4

continue — прерывает текущую итерацию и переходит к следующей. Управление возвращается к началу цикла, где проверяется условие.

for i in range(5):
if i == 2:
continue
print(i) # Вывод: 0, 1, 3, 4

pass — пустая операция. Используется как заглушка, когда синтаксически требуется наличие инструкции, но логика ещё не реализована.

if condition:
pass # Заглушка для будущей реализации
else:
print("Условие ложно")

pass также применяется в определениях классов, функций и блоков, где отсутствие кода привело бы к синтаксической ошибке.

Операторы is и == выполняют разные типы сравнения, что важно понимать для корректной работы с объектами.

== — проверяет равенство значений двух объектов. Вызывает метод __eq__() соответствующего класса.

is — проверяет идентичность объектов, то есть указывают ли две переменные на один и тот же объект в памяти (сравнивает их идентификаторы через id()).

Пример:

a = [1, 2, 3]
b = [1, 2, 3]

print(a == b) # True — значения одинаковы
print(a is b) # False — это разные объекты в памяти

Однако:

c = a
print(a is c) # True — c ссылается на тот же объект, что и a

Исключение составляют малые целые числа и строки, которые интернируются (кэшируются) интерпретатором. Например:

x = 256
y = 256
print(x is y) # True (в большинстве реализаций)

x = 257
y = 257
print(x is y) # Может быть False — зависит от контекста выполнения

По этой причине не рекомендуется использовать is для сравнения значений, особенно числовых или строковых. Оператор is следует применять в основном для сравнения с None, True, False и другими синглтонами:

if obj is None:
print("Объект не определён")

Это считается лучшей практикой, поскольку None — уникальный объект.